/**
 * 通信管理模块
 */
#ifndef _COMMUNICAATE_MGR_H_
#define _COMMUNICAATE_MGR_H_
#include <windows.h>
#include <vector>
#include "communicate_notify.h"

struct DevClientInfo {
    DevClientInfo(SOCKET _sock, int _dataBufferId, bool _hasAuth ) {
        sock = _sock;
        dataBufferId = _dataBufferId;
        hasAuthed = _hasAuth;
    }

    DevClientInfo() {

    }
    
    SOCKET sock;     // 设备端通信句柄 
    int dataBufferId; // 设备端对应的数据缓存ID
    bool hasAuthed;   // 设备是否已经鉴权
};

typedef enum {
    EVT_NONE = 0,
    EVT_SOCK_ERR = 1,   // socket错误
    EVT_NEW_CLIENT = 2, // 有新的客户端连接请求
    EVT_DATA_COMMING=3, // 有新的数据需要读取
    EVT_TIMEOUT = 4,    // 等待超时
}AsyncEvt;

class CommunicateMgr {
public:

	CommunicateMgr();

	~CommunicateMgr();
    
    bool startServer();

    bool stopServer();

	void registerNotify(CommunicateNotify *notify) {
		_notifyInterface = notify;
	}

    void unregisterNotify(CommunicateNotify *notify);

private: 

    // 执行异步读取
    AsyncEvt doAsyncSelect();

	void onAcceptNewClient();

	void onRecvClientData();

    static DWORD WINAPI TaskThreadProc(PVOID arg); 

private:
    /**
     * 通知列表
     */
    CommunicateNotify *_notifyInterface;

    /**
     * 是否运行工作线程
     */
    bool _isRunProc = false;

    /**
     * 服务端socket句柄
     */
    SOCKET _serverSock;

    HANDLE _taskProcHandle = NULL;

    std::vector<DevClientInfo> _devCLientInfoList;

	FD_SET _rfds;
};

#endif